<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Recharge;
use App\Models\Tenant;
use Carbon\Carbon;

class RechargeSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 获取所有租户
        $tenants = Tenant::all();
        
        if ($tenants->isEmpty()) {
            $this->command->warn('没有找到租户数据，请先运行 TenantSeeder');
            return;
        }

        $this->command->info('开始创建充值测试数据...');

        // 银行列表
        $banks = [
            '中国工商银行', '中国农业银行', '中国银行', '中国建设银行', 
            '交通银行', '招商银行', '浦发银行', '中信银行', 
            '中国民生银行', '华夏银行', '光大银行', '平安银行',
            '兴业银行', '中国邮政储蓄银行', '北京银行', '上海银行'
        ];

        // 落地公司列表
        $landingCompanies = [
            '北京乐业科技有限公司',
            '上海创新数字技术有限公司', 
            '深圳智能科技发展有限公司',
            '广州云端服务有限公司',
            '杭州数字化解决方案有限公司',
            '成都智慧科技有限公司',
            '武汉创新技术有限公司',
            '西安数字科技有限公司',
            '南京智能服务有限公司',
            '青岛海洋科技有限公司'
        ];

        // 状态及其权重
        $statusWeights = [
            'recharging' => 15,      // 充值中 - 15%
            'recharge_failed' => 5,  // 充值失败 - 5%
            'arrived' => 25,         // 已到账 - 25%
            'settled' => 35,         // 已结清 - 35%
            'partial_refund' => 10,  // 部分退账 - 10%
            'refunded' => 10         // 已退账 - 10%
        ];

        // 状态描述
        $statusDescriptions = [
            'recharge_failed' => [
                '银行卡号错误',
                '账户余额不足',
                '银行系统维护',
                '交易超时',
                '网络连接异常'
            ],
            'partial_refund' => [
                '部分金额用于结算',
                '客户申请部分退款',
                '系统调整金额',
                '合同变更导致退款'
            ],
            'refunded' => [
                '客户申请全额退款',
                '合同取消',
                '系统错误退款',
                '业务调整'
            ]
        ];

        $totalRecharges = 0;

        foreach ($tenants as $tenant) {
            // 每个租户创建20-50条充值记录
            $rechargeCount = rand(20, 50);
            
            for ($i = 0; $i < $rechargeCount; $i++) {
                // 根据权重随机选择状态
                $status = $this->getWeightedRandomStatus($statusWeights);
                
                // 生成创建时间（最近3个月内）
                $createdAt = Carbon::now()->subDays(rand(0, 90))->subHours(rand(0, 23))->subMinutes(rand(0, 59));
                
                // 生成金额（1000-1000000元，更真实的分布）
                $amount = $this->generateRealisticAmount();
                
                // 生成银行卡号
                $bankAccount = $this->generateBankAccount();
                
                // 生成状态描述
                $statusDescription = null;
                if (in_array($status, ['recharge_failed', 'partial_refund', 'refunded'])) {
                    $descriptions = $statusDescriptions[$status];
                    $statusDescription = $descriptions[array_rand($descriptions)];
                }
                
                // 生成时间戳
                $arrivedAt = null;
                $settledAt = null;
                $refundedAt = null;
                
                if (in_array($status, ['arrived', 'settled', 'partial_refund', 'refunded'])) {
                    $arrivedAt = $createdAt->copy()->addHours(rand(1, 48));
                }
                
                if (in_array($status, ['settled'])) {
                    $settledAt = $arrivedAt->copy()->addDays(rand(1, 30));
                }
                
                if (in_array($status, ['refunded'])) {
                    $refundedAt = $arrivedAt ? $arrivedAt->copy()->addDays(rand(1, 15)) : $createdAt->copy()->addDays(rand(1, 7));
                }

                // 创建充值记录
                Recharge::create([
                    'tenant_id' => $tenant->id,
                    'landing_company' => $landingCompanies[array_rand($landingCompanies)],
                    'amount' => $amount,
                    'bank_name' => $banks[array_rand($banks)],
                    'bank_account' => $bankAccount,
                    'status' => $status,
                    'status_description' => $statusDescription,
                    'remarks' => rand(0, 100) < 30 ? $this->generateRemarks() : null, // 30%概率有备注
                    'created_at' => $createdAt,
                    'updated_at' => $createdAt,
                    'arrived_at' => $arrivedAt,
                    'settled_at' => $settledAt,
                    'refunded_at' => $refundedAt,
                    'created_by' => 1,
                    'updated_by' => rand(0, 100) < 50 ? rand(1, 3) : null, // 50%概率有更新人
                ]);
                
                $totalRecharges++;
            }
            
            $this->command->info("租户 {$tenant->company_name} 创建了 {$rechargeCount} 条充值记录");
        }

        $this->command->info("充值测试数据创建完成！总计创建 {$totalRecharges} 条记录");
    }

    /**
     * 根据权重随机选择状态
     */
    private function getWeightedRandomStatus($weights)
    {
        $total = array_sum($weights);
        $random = rand(1, $total);
        $current = 0;
        
        foreach ($weights as $status => $weight) {
            $current += $weight;
            if ($random <= $current) {
                return $status;
            }
        }
        
        return array_key_first($weights);
    }

    /**
     * 生成真实的金额分布
     */
    private function generateRealisticAmount()
    {
        $rand = rand(1, 100);
        
        if ($rand <= 40) {
            // 40% - 小额充值：1000-10000元
            return rand(1000, 10000) + (rand(0, 99) / 100);
        } elseif ($rand <= 70) {
            // 30% - 中等充值：10000-50000元
            return rand(10000, 50000) + (rand(0, 99) / 100);
        } elseif ($rand <= 90) {
            // 20% - 较大充值：50000-200000元
            return rand(50000, 200000) + (rand(0, 99) / 100);
        } else {
            // 10% - 大额充值：200000-1000000元
            return rand(200000, 1000000) + (rand(0, 99) / 100);
        }
    }

    /**
     * 生成银行卡号
     */
    private function generateBankAccount()
    {
        // 生成16-19位银行卡号
        $length = rand(16, 19);
        $account = '';
        
        // 第一位不能是0
        $account .= rand(1, 9);
        
        // 剩余位数
        for ($i = 1; $i < $length; $i++) {
            $account .= rand(0, 9);
        }
        
        return $account;
    }

    /**
     * 生成备注
     */
    private function generateRemarks()
    {
        $remarks = [
            '季度结算资金充值',
            '项目启动资金',
            '月度运营费用充值',
            '紧急资金补充',
            '年度预算充值',
            '临时项目资金',
            '合作伙伴资金',
            '客户预付款充值',
            '营销推广费用',
            '技术服务费用充值',
            '人力成本预充值',
            '办公设备采购资金',
            '市场拓展资金',
            '研发经费充值',
            '培训费用预充值'
        ];
        
        return $remarks[array_rand($remarks)];
    }
}